package demo01;

import java.util.Scanner;

/**
 * @Author Zhang Chao
 * @Date 2021/3/22 15:09
 * @Version 1.0
 */


/*
 * 	某个公司采用公用电话传递数据信息，数据是小于8位的整数，为了确保安全，
 在传递过程中需要加密，加密规则如下：
 首先将数据倒序，然后将每位数字都加上5，再用和除以10的余数代替该数字，
 最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数，
 然后，把加密后的结果在控制台打印出来。
 分析：
 键盘录入数据
 写一个方法给数据加密
 首先键盘录入一个8位数并想办法存入一个int类型的数组中
 然后按要求对数组中的数操作
 输出加密后的数据
 */

public class Encrypt {

    public static void main(String[] args) {
        // 键盘录入一个8位数
        // 用什么类型的数据来接收呢，我们写两个方法一个接收的是int类型，另一个接收的是String类型
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入一个不大于8位的整数：");
        String str = sc.nextLine();
        // 写一个接收String类型的加密方法
        String line2 = enctypt2(str);
        System.out.println(line2);
        System.out.println("------------------");
        System.out.println("请再次录入刚才的数据：");
        int num = sc.nextInt();
        // 写一个接收int类型数据的加密方法
        String line = enctypt(num);
        System.out.println(line);

    }

    public static String enctypt2(String str) {
        /*
         * 刚才的难点是如何得到各位上的数并存储到数组中，以及index的使用 本题的难点是，如何把String类型的数据转换为int类型的数组
         * 分析： 可以先得到char数组，遍历数组得到每个字符，并转化为String类型 然后再通过String类型转换为int类型存入另一个数组中
         */
        char[] chs = str.toCharArray();
        // 定义一个与chs等长的int数组
        int[] is = new int[chs.length];
        // 遍历chs数组得到每个元素，先转化为String类型然后再转换为int类型，存入is中
        for (int x = 0; x < chs.length; x++) {
            is[x] = Integer.parseInt(String.valueOf(chs[x]));
        }
        // 至此，int数组创建完毕，且此时是正序，将数据倒序
        for (int start = 0, end = is.length-1; start < end; start++, end--) {
            int temp = is[start];
            is[start] = is[end];
            is[end] = temp;
        }
        // 将每位数字都加上5，再用和除以10的余数代替该数字
        for (int x = 0; x < is.length; x++) {
            is[x] += 5;
            is[x] %= 10;
        }
        // 将第一位和最后一位数字交换
        int temp = is[0];
        is[0] = is[is.length - 1];
        is[is.length - 1] = temp;
        // 用字符串拼接结果
        StringBuilder sb = new StringBuilder();
        for (int x = 0; x < is.length; x++) {
            sb.append(is[x]);
        }
        return sb.toString();
    }

    private static String enctypt(int num) {
        /*
         * 分析： 如何把一个int类型的数据转换为一个int类型的数组 我们要得到的是各位上的数，可以使用%10取余的方式获取个位数，
         * 然后除以10再次%10取余得到十位数 如此循环下去，直到除后的数不大于1
         */
        // 首先定义一个int数组
        // 因为最大数是8位数，所以我们定义一个长度为8的数组，然后再定义一个最大索引index
        // 我们操作时，只操作到最大数组即可
        int arr[] = new int[8];
        // 得到各位上的数并赋值给int数组
        int index = 0;
        while (num >= 1) {
            arr[index] = num % 10;
            num /= 10;
            index++;
        }
        // 此时的index等于数组的实际已经被赋值的个数
        // 此时已经得到了int数组，且已经完成了倒序
        // 将每位数字都加上5，再用和除以10的余数代替该数字

        // for (int i : arr) {
        // i += 5; 这里的增强for为什么不能用呢？？？？？？？
        // i %= 10;
        // }

        for (int x = 0; x < index; x++) {
            arr[x] += 5;
            arr[x] %= 10;
        }
        // 将第一位和最后一位数字交换
        int temp = arr[0];
        arr[0] = arr[index - 1];
        arr[index - 1] = temp;
        // 用字符串拼接结果
        StringBuilder sb = new StringBuilder();
        for (int x = 0; x < index; x++) {
            sb.append(arr[x]);
        }
        return sb.toString();
    }
}
